home *** CD-ROM | disk | FTP | other *** search
Text File | 1999-02-04 | 32.6 KB | 1,153 lines | [TEXT/CWIE] |
- // NetCache Resolver, 1995 (C) Mizutori Tetsuya
- // - NCR_AppleEvent.c, October 10, 1995
- // This document is pretty printed in 10-point Geneva font.
-
- //#define DEBUG 1
-
- #include <AppleEvents.h>
- #include <AERegistry.h>
- #include <AEObjects.h>
-
- #include "NCR_Basic.h"
- #include "NCR_AppleEvent.h"
- #include "NCR_File.h"
- #include "NCR_Resolve.h"
- #include "NCR_Qsort.h"
- #include "NCR_Error.h"
- #ifdef DEBUG
- #include "NCR_Message.h"
- #endif /* DEBUG */
-
- #ifdef COMMNET
- 1. Initialize
- call SetupAppleEvent()
-
- 2. Apple Event precess
- case: AEOpenApplication
- call DoOpenApplication()
- // set gAEOpenAppl = true
-
- case: AEOpenDocuments
- /// call DoOpenDocumentBegin()
- call DoOpenDocument( &theFSSpec, index, count ) for each file
- // set gAEOpenDoc = true
- /// call DoOpenDocumentEnd()
-
- case: AEPrintDocuments
- call DoPrintDocument()
- // set gAEPrintDoc = true
-
- case: AEQuitApplication
- call DoQuitApplication()
- // set gAEQuitAppl = true
-
- #endif /* COMMENT */
-
- enum myAppleEventSuits {
- // kAEActivate = 'actv', // Already defined in <AERegistry.h>
-
- // AppleScript Command: resolve $typeAlias$ [with sorted by $Enum$]
- kNCRSuite = 'MzcR', // EVENT CLASS
- kAEResolve = 'rslv', // EVENT ID
- // Reply:
- // typeAEList = 'list', // a list of string 'TEXT'
- // Direct Parameter:
- // typeAlias = 'alis', // a list of aliases
- // Other Parameters: [with sorted by name/date/size/type/url]
- kAESorted = 'soby', // KEYWORD
- typeSortOption = 'Esrt', // see also Enumaration
-
- // AppleScript Command: sort $typeAEList$
- // [at $integer$] [in regular/normal] [as alphabet/number] [with $TEXT$]
- // kNCRSuite = 'MzcR', // EVENT CLASS
- kAEMySort = 'sort', // EVENT ID
- // Reply:
- // typeAEList = 'list', // a list of string 'TEXT'
- // Direct Parameter:
- // typeAEList = 'list', // a list of string 'TEXT'
- // Other Parameter: [at $integer$]
- kAEPosition = 'posn', // KEYWORD
- // typeLongInteger = 'long', // field number
- // Other Parameter: [by name/date/size/type/url]
- // kAESorted = 'soby', // KEYWORD
- // typeSortOption = 'Esrt', // see also Enumaration
- // Other Parameter: [in regular/normal]
- kAEOrder = 'ordr', // KEYWORD
- typeOrderOption = 'Eord', // see also Enumaration
- // Other Parameter: [as alphabet/number]
- kAETypeAs = 'type', // KEYWORD
- typeTypeOption = 'Etyp', // see also Enumaration
- // Other Parameter: [with $TEXT$]
- kAESeparator = 'sepa', // KEYWORD
- // typeChar = 'TEXT', // field separator
-
- // AppleScript Command: assign $typeObjectSpecifier$ to value
- // kNCRSuite = 'MzcR', // EVENT CLASS
- // kAESetData = 'setd', // EVENT ID
- // Reply:
- // typeNull = 'null',
- // Direct Parameter:
- // typeObjectSpecifier = 'obj ', // an object
- // Other Parameters: to value
- // kAEData = 'data', // KEYWORD
- // typeWildCard = '****',
-
- // AppleScript Command: show about
- // kNCRSuite = 'MzcR', // EVENT CLASS
- kAEShowAbout = 'abou', // EVENT ID
- // Reply:
- // typeNull = 'null',
- // Direct Parameter:
- // typeNull = 'null',
- // Other Parameters:
- // typeNull = 'null',
-
- _myAppleEventSuits
- };
-
- enum myEnumerateKey {
- // typeSortOption = 'Esrt',
- keyByName = 'sona',
- keyByDate = 'soda',
- keyBySize = 'sosi',
- keyByType = 'soty',
- keyByUrl = 'sour',
- _myEnumerationKey
- };
-
- enum myEnumrateOrder {
- // typeOrderOption = 'Eord',
- keyOrdRegular = 'norm',
- keyOrdReverse = 'revs',
- _myEnumrationOrder
- };
-
- enum myEnumerateTypeAs {
- // typeTypeOption = 'Etyp',
- keyTypeAlpha = 'alph',
- keyTypeNumb = 'numb',
- _myEnumerateTypeAs
- };
-
- enum cacheLogField {
- kSortByName = 4,
- kSortByDate = 3,
- kSortBySize = 8,
- kSortByType = 6,
- kSortByUrl = 5,
- _cacheLogField
- };
-
- enum viewByConstants {
- // typeviewBy = 'vwBY',
- viewBySmallIcon = 'smic', // 0; bySmallIcon
- viewByIcon = 'iimg', // 1; byIcon
- viewByName = 'pnam', // 2; byName
- viewByModDate = 'modd', // 3; byModDate
- viewBySize = 'ptsz', // 4; bySize
- viewByKind = 'kind', // 5; byKind
- viewByCommnet = 'comt', // 6; byComment
- viewByLabel = 'labi', // 7; byLabel
- viewByVersion = 'vers', // 8; byVersion
- _viewByConstants
- };
-
- #ifdef COMMENT
- enum AppleEventConstants {
- kCoreEventClass = 'aevt',
- kAECoreSuite = 'core',
- kAEMiscStandards = 'misc',
- kAEOpenApplication = 'oapp',
- kAEOpenDocuments = 'odoc',
- kAEPrintDocuments = 'pdoc',
- kAEQuitApplication = 'quit',
- kAESetData = 'setd',
- kAEData = 'data',
- kAENoReply = 0x00000001,
- typeChar = 'TEXT',
- typeAEList = 'list',
- typeAERecord = 'reco',
- typeFSS = 'fss ',
- typeObjectSpecifier = 'obj ',
- typeWildCard = '****',
- typeType = 'type',
- typeKeyword = 'keyw',
- typeNull = 'null',
- keyDirectObject = '----',
- keyErrorNumber = 'errn',
- keyErrorString = 'errs',
- _AppleEventConstants
- };
- #endif /* COMMENT */
-
- /***** Constants & Globals *****/
- //extern Boolean gAEOpenAppl;
- //extern Boolean gAEOpenDocs;
- //extern Boolean gAEPrintDoc;
- //extern Boolean gAEQuitAppl;
-
- // callback functions, defined in 'main.c'
- extern OSErr DoOpenApplication ( void );
- extern OSErr DoQuitApplication ( void );
- extern OSErr DoPrintDocument ( void );
- //extern OSErr DoOpenDocumentBegin ( void );
- //extern OSErr DoOpenDocumentEnd ( void );
- extern OSErr DoOpenDocument ( FSSpec *theFSSpec, long index, long count );
-
-
- // prototypes
- /***** Do Apple Event process *****/
- pascal OSErr DoOpenApp ( AppleEvent *theAppleEvent, AppleEvent *reply, long refCon );
- pascal OSErr DoOpenDoc ( AppleEvent *theAppleEvent, AppleEvent *reply, long refCon );
- pascal OSErr DoPrintDoc ( AppleEvent *theAppleEvent, AppleEvent *reply, long refCon );
- pascal OSErr DoQuitApp ( AppleEvent *theAppleEvent, AppleEvent *reply, long refCon );
-
- /***** AppleScript Suite *****/
- pascal OSErr DoActivate ( AppleEvent *theAppleEvent, AppleEvent *reply, long refCon );
- pascal OSErr DoResolve ( AppleEvent *theAppleEvent, AppleEvent *reply, long refCon );
- pascal OSErr DoSort ( AppleEvent *theAppleEvent, AppleEvent *reply, long refCon );
- pascal OSErr DoSetData ( AppleEvent *theAppleEvent, AppleEvent *reply, long refCon );
- pascal OSErr DoShowAbout ( AppleEvent *theAppleEvent, AppleEvent *reply, long refCon );
- pascal OSErr DoMiscEvent ( AppleEvent *theAppleEvent, AppleEvent *reply, long refCon );
-
- /***** Apple Event routines *****/
- static OSErr GotRequiredParams ( AppleEvent *appleEvent );
- static OSErr AEPutFieldArray ( AEDescList *resultList, ArrayHandle arrayH );
- static void ErrMsgAE ( long err, Boolean fatal );
-
- /***** setup Apple Event handles *****/
-
- /*
- #define AEInstall(eventClass,eventID,procHandle) {¥
- err = AEInstallEventHandler( eventClass, eventID, (AEEventHandlerProcPtr)procHandle, 0L, false); ¥
- if ( err != noErr ) ErrorMessageAE( err, true ); }
- */
- #define AEInstall(eventClass,eventID,procHandle) {¥
- err = AEInstallEventHandler( eventClass, eventID, NewAEEventHandlerProc(procHandle), 0L, false); ¥
- if ( err != noErr ) ErrorMessageAE( err, true ); }
-
- void SetupAppleEvent ( void )
- {
- OSErr err;
- long feature;
-
- GestaltCheck( gestaltAppleEventsAttr );
-
- // for Required Suite
- AEInstall( kCoreEventClass, kAEOpenApplication, DoOpenApp );
- AEInstall( kCoreEventClass, kAEOpenDocuments, DoOpenDoc );
- AEInstall( kCoreEventClass, kAEPrintDocuments, DoPrintDoc );
- AEInstall( kCoreEventClass, kAEQuitApplication, DoQuitApp );
-
- // for AppleScript Suite
- // AEInstall( kAECoreSuite, kAECreateElement, DoCreateElement );
- // AEInstall( kAECoreSuite, kAEClose, DoCloseElement );
- AEInstall( kAEMiscStandards, kAEActivate, DoActivate );
- AEInstall( kNCRSuite, kAESetData, DoSetData );
- // AEInstall( kAECoreSuite, kAEGetData, DoGetData );
- AEInstall( kNCRSuite, kAEResolve, DoResolve );
- AEInstall( kNCRSuite, kAEMySort, DoSort );
- AEInstall( kNCRSuite, kAEShowAbout, DoShowAbout );
- // AEInstall( typeWildCard, typeWildCard, DoMiscEvent );
-
-
- #ifdef COMMENT // for Resolving Object Specifier Records
- err = AEInstallObjectAccessor( cProperty, typeWildCard, (OSLAccessorProcPtr) MyPropertyObjectAccessor, 0, false );
- if ( err != noErr ) Message("MyPropertyObjectAccessor not available.¥n");
-
- err = AEInstallObjectAccessor( typeWildCard, typeWildCard, (OSLAccessorProcPtr) MyObjectAccessor, 0, false );
- if ( err != noErr ) Message("MyObjectAccessor not available.¥n");
-
- err = AESetObjectCallbacks(
- (OSLCompareProcPtr) MyCompareObjects,
- (OSLCountProcPtr) MyCountObjects,
- (OSLDisposeTokenProcPtr)nil,
- (OSLGetMarkTokenProcPtr)nil,
- (OSLMarkProcPtr)nil,
- (OSLAdjustMarksProcPtr)nil,
- (OSLGetErrDescProcPtr)nil);
- if ( err != noErr ) Message("AESetObjectCallbacks not available.¥n");
- #endif /* COMMENT */
-
- err = AESetInteractionAllowed( kAEInteractWithLocal );
- }
-
- /***** Do Apple Event process *****/
- pascal OSErr DoOpenApp ( AppleEvent *theAppleEvent, AppleEvent *reply, long refCon )
- {
- #ifdef DEBUG
- Message("Apple event: Open Application Event¥n");
- #endif /* DEBUG */
-
- DoOpenApplication();
-
- // gAEOpenAppl = true;
-
- return noErr;
- }
-
- pascal OSErr DoOpenDoc ( AppleEvent *theAppleEvent, AppleEvent *reply, long refCon )
- {
- AEDescList fileSpecList = {typeNull, nil};
- FSSpec fileSpec;
- DescType type;
- AEKeyword keyword;
- Size actual;
- long count;
- long index;
- OSErr err = noErr;
-
- #ifdef DEBUG
- Message("Apple event: Open Document Event¥n");
- #endif /* DEBUG */
-
- // DoOpenDocumentBegin();
-
- err = AEGetParamDesc( theAppleEvent, keyDirectObject, typeAEList, &fileSpecList);
- if ( err != noErr ) { ErrMsgAE( err, false); goto out; }
-
- err = GotRequiredParams( theAppleEvent );
- if ( err != noErr ) { ErrMsgAE( err, false ); goto out; }
-
- err = AECountItems( &fileSpecList, &count );
- if ( err != noErr ) { ErrMsgAE( err, false ); goto out; }
-
- for (index=1; index<=count; index++) {
- err = AEGetNthPtr( &fileSpecList, index, typeFSS, &keyword, &type,
- (Ptr) &fileSpec, sizeof( FSSpec ), &actual );
- if ( err != noErr ) { ErrMsgAE( err, false ); goto out; }
-
- err = DoOpenDocument( &fileSpec, index, count );
- if ( err != noErr ) break;
- }
-
- out:
- if ( fileSpecList.dataHandle != nil ) AEDisposeDesc( &fileSpecList );
-
- // DoOpenDocumentEnd();
- // gAEOpenDocs = true;
-
- return err;
- }
-
- pascal OSErr DoPrintDoc ( AppleEvent *theAppleEvent, AppleEvent *reply, long refCon )
- {
- #ifdef DEBUG
- Message("Apple event: Print Document Event¥n");
- #endif /* DEBUG */
-
- DoPrintDocument();
-
- // gAEPrintDoc = true;
-
- return noErr;
- }
-
- pascal OSErr DoQuitApp ( AppleEvent *theAppleEvent, AppleEvent *reply, long refCon )
- {
- #ifdef DEBUG
- Message("Apple event: Quit Application Event¥n");
- #endif /* DEBUG */
-
- DoQuitApplication();
-
- // gAEQuitAppl = true;
-
- return noErr;
- }
-
- /***** AppleScript Suite *****/
- /***** Command: activate *****/
- pascal OSErr DoActivate ( AppleEvent *theAppleEvent, AppleEvent *reply, long refCon )
- {
- ProcessSerialNumber PSN;
- OSErr err;
-
- #ifdef DEBUG
- Message("Apple event: Activate Event¥n");
- #endif /* DEBUG */
-
- err = GetCurrentProcess( &PSN );
- if ( err != noErr ) {
- ErrMsgAE( err, false );
- } else {
- err = SetFrontProcess( &PSN );
- }
-
- return err;
- }
-
-
- /***** Command: resolve *****/
- #ifdef COMMENT
- // AppleScript Command: resolve $typeAlias$ [with sorted by $Enum$]
- kNCRSuite = 'MzcR', // EVENT CLASS
- kAEResolve = 'rslv', // EVENT ID
- // Reply:
- typeAEList = 'list', // a list of string 'TEXT'
- // Direct Parameter:
- typeAlias = 'alis', // a list of aliases
- // Other Parameters: [with sorted by name/date/size/type/url]
- kAESorted = 'soby', // KEYWORD
- typeSortOption = 'Esrt', // see also Enumaration
- #endif /* COMMENT */
-
-
- pascal OSErr DoResolve ( AppleEvent *theAppleEvent, AppleEvent *reply, long refCon )
- {
- AEDescList fileSpecList = {typeNull, nil};
- AEDesc fileSpecDesc = {typeNull, nil};
- AEDesc desc = {typeNull, nil};
- long sortKeyPosition = 0;
- Boolean withSorted = false;
- Boolean asNumber = false;
- Boolean inReverse = false;
- AEDescList resultList = {typeNull, nil};
- long index, indexLast=0, count;
- DescType type, dataType;
- OSErr err = noErr;
-
- #ifdef DEBUG
- Message("Apple event: Resolve Event¥n");
- #endif /* DEBUG */
-
- // Responding to AppleEvent message
- // Get Direct Parameter
- #ifdef DEBUG
- Message("DoResolve: Direct Param¥n");
- #endif /* DEBUG */
- err = AEGetParamDesc( theAppleEvent, keyDirectObject, typeAEList, &fileSpecList); // created 'fileSpecList'
- if ( err != noErr ) { ErrMsgAE( err, false); goto out_responding; }
-
- err = AECountItems( &fileSpecList, &count );
- if ( err != noErr ) { ErrMsgAE( err, false ); goto out_responding; }
-
- for (index=1; index<=count; index++) {
- FSSpec fileSpec;
- Size actual;
- AEKeyword keyword;
-
- err = AEGetNthPtr( &fileSpecList, index, typeFSS, &keyword, &type,
- (Ptr) &fileSpec, sizeof( FSSpec ), &actual );
- if ( err != noErr ) { ErrMsgAE( err, false ); goto out_responding; }
- AEPutFile ( &fileSpec );
- }
-
- // Get Other Parameter [with sorted by $Enum$]
- #ifdef DEBUG
- Message("DoResolve: Other Param [with sorted by]¥n");
- #endif /* DEBUG */
- err = AEGetParamDesc( theAppleEvent, kAESorted, typeWildCard, &desc); // created 'desc'
- if ( err != noErr ) {
- if ( err != errAEDescNotFound ) { ErrMsgAE( err, false ); goto out_responding; }
- // sortKeyPosition = 0;
- // withSorted = false;
- } else {
- type = desc.descriptorType;
- if ( type == typeEnumerated ) {
- dataType = * (DescType *) *desc.dataHandle;
- #ifdef DEBUG
- Message("DoResolve: Param [with sorted by '%T'] as '%T'¥n", dataType, type );
- #endif /* DEBUG */
- withSorted = true; asNumber = false; inReverse = false;
- switch ( dataType ) {
- case keyByName: sortKeyPosition = kSortByName; break;;
- case keyByDate: sortKeyPosition = kSortByDate; asNumber = true; inReverse = true; break;
- case keyBySize: sortKeyPosition = kSortBySize; asNumber = true; inReverse = true; break;
- case keyByType: sortKeyPosition = kSortByType; break;
- case keyByUrl: sortKeyPosition = kSortByUrl; break;
- default:
- #ifdef DEBUG
- Message("DoResolve: Wrong Param [with sorted by '%T'] as '%T'¥n", dataType, type );
- #endif /* DEBUG */
- withSorted = false;
- err = errAEWrongDataType; goto out_responding;
- break;
- }
- } else {
- #ifdef DEBUG
- Message("DoResolve: Wrong Param [with sorted by '%T']¥n", type );
- #endif /* DEBUG */
- withSorted = false;
- err = errAEWrongDataType; goto out_responding;
- }
- }
- if ( desc.dataHandle != nil ) AEDisposeDesc( &desc ); // dispose of 'desc'
-
- #ifdef DEBUG
- Message("DoResolve: Param position(%ld), asNum(%d), inRev(%d)¥n",
- sortKeyPosition, asNumber, inReverse);
- #endif /* DEBUG */
-
- // Have I read through the parameters?
- #ifdef DEBUG
- Message("Apple event: DoResolve GotRequiredParams()¥n");
- #endif /* DEBUG */
- err = GotRequiredParams( theAppleEvent );
- if ( err != noErr ) { ErrMsgAE( err, false ); goto out_responding; }
-
- out_responding:
- if ( fileSpecList.dataHandle != nil ) AEDisposeDesc( &fileSpecList ); // dispose of 'fileSpecList'
- if ( desc.dataHandle != nil ) AEDisposeDesc( &desc ); // dispose of 'desc' if needed
- if ( err != noErr ) goto out;
-
-
- // Handling data with parameters
- count = AECountFileList();
-
- // Creating and Sending AppleEvent message
- #ifdef DEBUG
- Message("Apple event: DoResolve AECreateList()¥n");
- #endif /* DEBUG */
- err = AECreateList( nil, 0, false, &resultList ); // create a AEDisc 'resultList'
- if ( err != noErr ) { ErrMsgAE( err, false ); goto out_sending; }
-
- // add the contents of the file to 'resultList'
- for ( index=0; index<count; index++ ) {
- FSSpec fileSpec;
- FInfo fileInfo;
- Handle arrayH = nil;
- Handle theHndl = nil;
- long datasize, arraySize;
-
- AEGetFile ( &fileSpec, index );
-
- #ifdef DEBUG
- Message("filename[%ld]='%S'¥n",(index+1),fileSpec.name);
- Message("Apple event: DoResolve AEPutPtr(%ld)¥n", (index+1));
- #endif /* DEBUG */
-
- #ifdef Not_Yet_Implemented
-
- err = AEPutPtr( &resultList, indexLast, typeChar, &fileSpec.name[1], fileSpec.name[0] );
- if ( err != noErr ) { ErrMsgAE( err, false ); goto out_sending; }
-
- #else /* Not_Yet_Implemented */
-
- // read record from the file
- theHndl = NewHandleClear( 0 ); // create a Handle 'theHndl'
- if ( (err=MemError()) != noErr ) { ErrorMessageMEM( err, true ); }
-
- err = GetRecordFromFile ( &fileSpec, &fileInfo, theHndl, &datasize );
- if ( err != noErr ) { ErrMsgAE( err, false ); goto out_putting; }
-
- // convert 'theHndl' to 'arrayH' with sorting
- arrayH = NewHandleClear( 0 ); // create a Handle 'arrayH'
- if ( (err=MemError()) != noErr ) { ErrorMessageMEM( err, true ); }
-
- // use default Field Separator and Record Separator
- arraySize = SetupFieldArray( theHndl, (ArrayHandle) arrayH, sortKeyPosition );
-
- if ( withSorted ) {
- HLock( arrayH );
- quicksort( (Array *) *arrayH, 0, arraySize-1, asNumber, inReverse );
- HUnlock( arrayH );
- }
-
- // add 'arrayH' to 'resultList'
- err = AEPutFieldArray( &resultList, (ArrayHandle) arrayH );
- if ( err != noErr ) { ErrMsgAE( err, false ); }
-
- out_putting:
- if ( arrayH != nil ) DisposeHandle( arrayH ); // dispose the Handle 'arrayH'
- if ( theHndl != nil ) DisposeHandle( theHndl ); // dispose the Handle 'theHndl'
- #endif /* Not_Yet_Implemented */
- }
-
- #ifdef DEBUG
- Message("Apple event: DoResolve AEPutParamDesc()¥n");
- #endif /* DEBUG */
- err = AEPutParamDesc( reply, keyDirectObject, &resultList );
- if ( err != noErr ) { ErrMsgAE( err, false ); goto out_sending; }
-
- out_sending:
- if ( resultList.dataHandle != nil ) AEDisposeDesc( &resultList ); // dispose the AEDisc 'resultList'
-
- out:
- AEDisposFileList();
-
- return err;
- }
-
- /***** Command: sort *****/
- #ifdef COMMENT
- // AppleScript Command: sort $typeAEList$
- // [at $integer$] [in regular/normal] [as alphabet/number] [with $TEXT$]
- kNCRSuite = 'MzcR', // EVENT CLASS
- kAEMySort = 'sort', // EVENT ID
- // Reply:
- typeAEList = 'list', // a list of string 'TEXT'
- // Direct Parameter:
- typeAEList = 'list', // a list of string 'TEXT'
- // Other Parameters: [at $integer$]
- kAEPosition = 'posn', // KEYWORD
- typeLongInteger = 'long', // field number
- // Other Parameter: [by name/date/size/type/url]
- kAESorted = 'soby', // KEYWORD
- typeSortOption = 'Esrt', // see also Enumaration
- // Other Parameters: [in regular/normal]
- kAEOrder = 'ordr', // KEYWORD
- typeOrderOption = 'Eord', // see also Enumaration
- // Other Parameters: [as alphabet/number]
- kAETypeAs = 'type', // KEYWORD
- typeTypeOption = 'Etyp', // see also Enumaration
- // Other Parameters: [with $TEXT$]
- kAESeparator = 'sepa', // KEYWORD
- typeChar = 'TEXT', // field separator
- #endif /* COMMENT */
-
- #define TAB '¥t' // Field Separator
- #define EOL '¥r' // Record Separator
-
- pascal OSErr DoSort ( AppleEvent *theAppleEvent, AppleEvent *reply, long refCon )
- {
- AEDescList descList = {typeNull, nil};
- AEDescList resultList = {typeNull, nil};
- AEDesc desc = {typeNull, nil};
- DescType type, dataType;
- AEKeyword theAEKeyword;
-
- Handle theHndl = nil;
- Handle arrayH = nil;
- long size;
- long sortKeyPosition = 4;
- Boolean inReverse = false;
- Boolean asNumber = false;
- unsigned char fieldSeparator = TAB;
-
- long count, index;
- OSErr err = noErr;
-
- #ifdef DEBUG
- Message("Apple event: Sort Event¥n");
- #endif /* DEBUG */
-
- // Responding to AppleEvent message
- // Direct Parameter
- #ifdef DEBUG
- Message("DoSort: Direct Param¥n");
- #endif /* DEBUG */
- err = AEGetParamDesc( theAppleEvent, keyDirectObject, typeAEList, &descList ); // create AEDisc 'descList'
- if ( err != noErr ) { ErrMsgAE( err, false); goto out_responding; }
-
- err = AECountItems( &descList, &count );
- if ( err != noErr ) { ErrMsgAE( err, false ); goto out_responding; }
-
- theHndl = NewHandleClear( 0 ); // create a handle 'theHndl'
- if ( (err=MemError()) != noErr ) { ErrorMessageMEM( err, true ); }
-
- for (index=1; index<=count; index++) {
- Handle theHndl2;
- long size2;
-
- err = AEGetNthDesc( &descList, index, typeChar, &theAEKeyword, &desc ); // created 'desc'
- if ( err != noErr ) { ErrMsgAE( err, false ); goto out_responding; }
- theHndl2 = desc.dataHandle;
- size = GetHandleSize(theHndl);
- size2 = GetHandleSize(theHndl2);
- SetHandleSize( theHndl, size+size2+1);
- if ( (err=MemError()) != noErr ) { ErrorMessageMEM( err, true ); }
- BlockMove( (Ptr) *theHndl2, (Ptr) *theHndl+size, size2 );
- ((unsigned char *) *theHndl)[size+size2] = EOL;
-
- if ( desc.dataHandle != nil ) AEDisposeDesc( &desc ); // dispose of 'desc'
- }
-
- // Other Parameter [at $integer$]
- #ifdef DEBUG
- Message("DoSort: Param [at $integer$]¥n");
- #endif /* DEBUG */
- desc.dataHandle = nil;
- err = AEGetParamDesc( theAppleEvent, kAEPosition, typeWildCard, &desc); // created 'desc'
- if ( err != noErr ) {
- if ( err != errAEDescNotFound ) { ErrMsgAE( err, false ); goto out_responding; }
- // sortKeyPosition = 0;
- } else {
- type = desc.descriptorType;
- if ( type == typeLongInteger ) {
- sortKeyPosition = * (long *) *desc.dataHandle;
- #ifdef DEBUG
- Message("DoSort: Param [at %ld] as '%T'¥n", sortKeyPosition, type );
- #endif /* DEBUG */
- } else {
- #ifdef DEBUG
- Message("DoSort: Wrong Param by '%T'¥n", type );
- #endif /* DEBUG */
- err = errAEWrongDataType; goto out_responding;
- }
- }
- if ( desc.dataHandle != nil ) AEDisposeDesc( &desc ); // dispose of 'desc'
-
- // Get Other Parameter [by name/date/size/type/url]
- #ifdef DEBUG
- Message("DoSort: Other Param [with sorted by]¥n");
- #endif /* DEBUG */
- err = AEGetParamDesc( theAppleEvent, kAESorted, typeWildCard, &desc); // created 'desc'
- if ( err != noErr ) {
- if ( err != errAEDescNotFound ) { ErrMsgAE( err, false ); goto out_responding; }
- // sortKeyPosition = 0;
- } else {
- type = desc.descriptorType;
- if ( type == typeEnumerated ) {
- dataType = * (DescType *) *desc.dataHandle;
- #ifdef DEBUG
- Message("DoSort: Param [with sorted by '%T'] as '%T'¥n", dataType, type );
- #endif /* DEBUG */
- asNumber = false; inReverse = false;
- switch ( dataType ) {
- case keyByName: sortKeyPosition = kSortByName; break;;
- case keyByDate: sortKeyPosition = kSortByDate; asNumber = true; inReverse = true; break;
- case keyBySize: sortKeyPosition = kSortBySize; asNumber = true; inReverse = true; break;
- case keyByType: sortKeyPosition = kSortByType; break;
- case keyByUrl: sortKeyPosition = kSortByUrl; break;
- default:
- #ifdef DEBUG
- Message("DoResolve: Wrong Param [with sorted by '%T'] as '%T'¥n", dataType, type );
- #endif /* DEBUG */
- err = errAEWrongDataType; goto out_responding;
- break;
- }
- } else {
- #ifdef DEBUG
- Message("DoResolve: Wrong Param [with sorted by '%T']¥n", type );
- #endif /* DEBUG */
- err = errAEWrongDataType; goto out_responding;
- }
- }
- if ( desc.dataHandle != nil ) AEDisposeDesc( &desc ); // dispose of 'desc'
-
- // Other Parameter [in regular/normal]
- #ifdef DEBUG
- Message("DoSort: Param [in regular/normal]¥n");
- #endif /* DEBUG */
- desc.dataHandle = nil;
- err = AEGetParamDesc( theAppleEvent, kAEOrder, typeWildCard, &desc); // created 'desc'
- if ( err != noErr ) {
- if ( err != errAEDescNotFound ) { ErrMsgAE( err, false ); goto out_responding; }
- // inReverse = false;
- } else {
- type = desc.descriptorType;
- if ( type == typeEnumerated ) {
- dataType = * (DescType *) *desc.dataHandle;
- #ifdef DEBUG
- Message("DoSort: Param [in '%T'] as '%T'¥n", dataType, type );
- #endif /* DEBUG */
- switch ( dataType ) {
- case keyOrdRegular: inReverse = false; break;
- case keyOrdReverse: inReverse = true; break;
- default:
- #ifdef DEBUG
- Message("DoSort: Wrong Param [in '%T'] by '%T'¥n", dataType, type );
- #endif /* DEBUG */
- err = errAEWrongDataType; goto out_responding;
- break;
- }
- } else {
- #ifdef DEBUG
- Message("DoSort: Wrong Param by '%T'¥n", type );
- #endif /* DEBUG */
- err = errAEWrongDataType; goto out_responding;
- }
- }
- if ( desc.dataHandle != nil ) AEDisposeDesc( &desc ); // dispose of 'desc'
-
- // Other Parameter [as alphabet/number]
- #ifdef DEBUG
- Message("DoSort: Param [as alphabet/number]¥n");
- #endif /* DEBUG */
- desc.dataHandle = nil;
- err = AEGetParamDesc( theAppleEvent, kAETypeAs, typeWildCard, &desc); // created 'desc'
- if ( err != noErr ) {
- if ( err != errAEDescNotFound ) { ErrMsgAE( err, false ); goto out_responding; }
- // asNumber = false;
- } else {
- type = desc.descriptorType;
- if ( type == typeEnumerated ) {
- dataType = * (DescType *) *desc.dataHandle;
- #ifdef DEBUG
- Message("DoSort: Param [as '%T'] as '%T'¥n", dataType, type );
- #endif /* DEBUG */
- switch ( dataType ) {
- case keyTypeAlpha: asNumber = false; break;
- case keyTypeNumb: asNumber = true; break;
- default:
- #ifdef DEBUG
- Message("DoSort: Wrong Param [as '%T'] by '%T'¥n", dataType, type );
- #endif /* DEBUG */
- err = errAEWrongDataType; goto out_responding;
- break;
- }
- } else {
- #ifdef DEBUG
- Message("DoSort: Wrong Param by '%T'¥n", type );
- #endif /* DEBUG */
- err = errAEWrongDataType; goto out_responding;
- }
- }
- if ( desc.dataHandle != nil ) AEDisposeDesc( &desc ); // dispose of 'desc'
-
- // Other Parameter [with $TEXT$]
- #ifdef DEBUG
- Message("DoSort: Param [with $TEXT$]¥n");
- #endif /* DEBUG */
- desc.dataHandle = nil;
- err = AEGetParamDesc( theAppleEvent, kAESeparator, typeWildCard, &desc); // created 'desc'
- if ( err != noErr ) {
- if ( err != errAEDescNotFound ) { ErrMsgAE( err, false ); goto out_responding; }
- // fieldSeparator = TAB;
- } else {
- type = desc.descriptorType;
- if ( type == typeChar ) {
- fieldSeparator = * (unsigned char *) *desc.dataHandle;
- #ifdef DEBUG
- Message("DoSort: Param [with ¥¥%03o] as '%T'¥n", fieldSeparator, type );
- #endif /* DEBUG */
- } else {
- #ifdef DEBUG
- Message("DoSort: Wrong Param by '%T'¥n", type );
- #endif /* DEBUG */
- err = errAEWrongDataType; goto out_responding;
- }
- }
- if ( desc.dataHandle != nil ) AEDisposeDesc( &desc ); // dispose of 'desc'
-
-
- #ifdef DEBUG
- Message("DoSort: Param position(%ld), asNum(%d), inRev(%d)¥n",
- sortKeyPosition, asNumber, inReverse);
- #endif /* DEBUG */
-
- // Have I read through the parameters?
- #ifdef DEBUG
- Message("Apple event: DoSort GotRequiredParams()¥n");
- #endif /* DEBUG */
- err = GotRequiredParams( theAppleEvent );
- if ( err != noErr ) { ErrMsgAE( err, false ); goto out_responding; }
-
- out_responding:
- if ( desc.dataHandle != nil ) AEDisposeDesc( &desc ); // dispose the AEDesc 'desc' if needed
- if ( err != noErr ) goto out;
-
-
- // Handling data with parameters
-
- arrayH = NewHandleClear( 0 ); // create a Handle 'arrayH'
- if ( (err=MemError()) != noErr ) { ErrorMessageMEM( err, true ); }
-
- ((Array *) *arrayH)->fs = fieldSeparator;
- count = SetupFieldArray( theHndl, (ArrayHandle) arrayH, sortKeyPosition );
-
- HLock( arrayH );
- quicksort( (Array *) *arrayH, 0, count-1, asNumber, inReverse );
- HUnlock( arrayH );
-
-
- // Creating and Sending AppleEvent message
-
- #ifdef DEBUG
- Message("Apple event: DoResolve AECreateList()¥n");
- #endif /* DEBUG */
- err = AECreateList( nil, 0, false, &resultList ); // create a AEDesc 'resultList'
- if ( err != noErr ) { ErrMsgAE( err, false ); goto out_sending; }
-
- err = AEPutFieldArray( &resultList, (ArrayHandle) arrayH );
- if ( err != noErr ) { ErrMsgAE( err, false ); goto out_sending; }
-
- #ifdef DEBUG
- Message("Apple event: DoSort AEPutParamDesc()¥n");
- #endif /* DEBUG */
- err = AEPutParamDesc( reply, keyDirectObject, &resultList );
- if ( err != noErr ) { ErrMsgAE( err, false ); goto out_sending; }
-
- out_sending:
- if ( arrayH != nil ) DisposeHandle( arrayH ); // dispose the Handle 'arrayH'
- if ( resultList.dataHandle != nil ) AEDisposeDesc( &resultList ); // dispose the AEDesc 'resultList'
- goto out;
-
- out:
- if ( theHndl != nil ) DisposeHandle( theHndl); // dispose handle 'theHndl'
-
- return err;
- }
-
- /***** Command: assign *****/
- #ifdef COMMENT
- // AppleScript Command: assign $typeObjectSpecifier$ to value
- kNCRSuite = 'MzcR', // EVENT CLASS
- kAESetData = 'setd', // EVENT ID
- // Reply:
- typeNull = 'null',
- // Direct Parameter:
- typeObjectSpecifier = 'obj ', // an object
- // Other Parameters: to value
- kAEData = 'data', // KEYWORD
- typeWildCard = '****',
- #endif /* COMMENT */
-
- pascal OSErr DoSetData ( AppleEvent *theAppleEvent, AppleEvent *reply, long refCon )
- {
- #ifdef DEBUG
- Message("Apple event: Set Data Event¥n");
- #endif /* DEBUG */
-
- // Sorry, do nothing here.
-
- return noErr;
- }
-
- /***** Command: show about *****/
- #ifdef COMMENT
- // AppleScript Command: show about
- kNCRSuite = 'MzcR', // EVENT CLASS
- kAEShowAbout = 'abou', // EVENT ID
- // Reply:
- typeNull = 'null',
- // Direct Parameter:
- typeNull = 'null',
- // Other Parameters:
- typeNull = 'null',
- #endif /* COMMENT */
-
- #define kAboutID 130
-
- pascal Boolean idleProc ( EventRecord *event, long *sleeptime, RgnHandle *mouseRgn );
-
- pascal OSErr DoShowAbout ( AppleEvent *theAppleEvent, AppleEvent *reply, long refCon )
- {
- OSErr err;
-
- #ifdef DEBUG
- Message("Apple event: Show About¥n");
- #endif /* DEBUG */
-
- /* err = AEInteractWithUser( kAEDefaultTimeout, nil, (AEIdleProcPtr) idleProc ); */
- err = AEInteractWithUser( kAEDefaultTimeout, nil, NewAEIdleProc(idleProc) );
- if ( err != noErr ) { ErrMsgAE( err, false ); return err; }
-
- Alert( kAboutID, nil );
-
- return noErr;
- }
-
- pascal Boolean idleProc ( EventRecord *event, long *sleeptime, RgnHandle *mouseRgn )
- {
- switch ( event->what ) {
- case updateEvt:
- case activateEvt:
- case osEvt:
- break;
- case nullEvent:
- SystemTask();
- break;
- }
-
- return false;
- }
-
- /***** Command: miscellaneous *****/
- pascal OSErr DoMiscEvent ( AppleEvent *theAppleEvent, AppleEvent *reply, long refCon )
- {
- #ifdef DEBUG
- Message("Apple event: Miscellaneous Event¥n");
- #endif /* DEBUG */
-
- //MyInspectDescList( theAppleEvent );
-
- return noErr;
- }
-
-
- /***** Apple Event routines *****/
- static OSErr GotRequiredParams ( AppleEvent *appleEvent )
- {
- DescType returnedType;
- Size actualSize;
- OSErr err;
-
- err = AEGetAttributePtr( appleEvent, keyMissedKeywordAttr, typeWildCard,
- &returnedType, nil, 0, &actualSize );
-
- if ( err == errAEDescNotFound ) return noErr;
- else if ( err == noErr ) return errAEEventNotHandled;
- else return err;
- }
-
- static OSErr AEPutFieldArray ( AEDescList *resultList, ArrayHandle arrayH )
- {
- Handle theHndl;
- long count, len, k;
- long indexLast=0;
- unsigned char *p, *q;
- OSErr err = noErr;
-
- count = ((Array *) *arrayH)->count;
- if ( count <= 0 ) return err;
-
- theHndl = ((Array *) *arrayH)->h;
- HLock( theHndl );
- p = (unsigned char *) *theHndl;
-
- for ( k=0; k<count; k++ ) {
- #ifdef TEST_QSORT
- q = p + ((Array *) *arrayH)->pair[k].keyword;
- len = ((Array *) *arrayH)->pair[k].keywordlen;
- #else /* TEST_QSORT */
- q = p + ((Array *) *arrayH)->pair[k].text;
- len = ((Array *) *arrayH)->pair[k].textlen;
- #endif /* TEST_QSORT */
- #ifdef DEBUG
- // Message("Apple event: DoResolveRecord AEPutPtr(%ld)¥n", (k+1));
- #endif /* DEBUG */
- err = AEPutPtr( resultList, indexLast, typeChar, q, len );
- if ( err != noErr ) { ErrMsgAE( err, false ); break; }
- }
-
- HUnlock( theHndl );
-
- return err;
- }
-
-
- static void ErrMsgAE ( long err, Boolean fatal )
- {
- #ifdef DEBUG
- ErrorMessageAE ( err, fatal );
- #endif /* DEBUG */
- }
-
- /***** Apple Event FileList *****/
-
- static long gFSSpecListNum = 0;
- static Handle gFSSpecList = nil;
-
- long AECountFileList ( void )
- {
- return gFSSpecListNum;
- }
-
- void AEPutFile ( FSSpec *theFSSpec )
- {
- long index;
- Size dataSize = sizeof( FSSpec );
- Handle theHandle;
- OSErr err;
-
- theHandle = gFSSpecList;
-
- if ( theHandle == nil ) {
- theHandle = NewHandleClear( dataSize );
- gFSSpecList = theHandle;
- if ( theHandle == nil ) { /* error */
- ErrorMessageMEM( memFullErr, true ); }
- } else {
- dataSize += GetHandleSize( theHandle );
- SetHandleSize( theHandle, dataSize );
- if ( (err=MemError()) != noErr ) { /* error */
- ErrorMessageMEM( err, true ); }
- }
-
- index = gFSSpecListNum;
- ((FSSpec *) *theHandle)[index] = *theFSSpec;
-
- gFSSpecListNum += 1;
- }
-
- Boolean AEGetFile ( FSSpec *theFSSpec, long index )
- {
- if ( index < 0 || gFSSpecListNum <= index ) return false;
-
- *theFSSpec = ((FSSpec *) *gFSSpecList)[index];
-
- return true;
- }
-
- void AEDisposFileList ( void )
- {
- if ( gFSSpecList != nil ) DisposeHandle( gFSSpecList );
- gFSSpecList = nil;
-
- gFSSpecListNum = 0;
- }
-
-
- // end of program
-
- #ifdef SAMPLE
- void main( void )
- {
- GestaltCheck( gestaltSystemVersion );
- // GestaltCheck( gestaltProcessorType ); // for version 1.1.1
-
- InitToolbox();
- SetupMenuBar();
- SetupAppleEvent();
-
- EventLoop();
-
- ExitToShell();
- }
-
- void EventLoop( void )
- {
- Boolean gotEvent;
- EventRecord event;
- RgnHandle mouseRgn;
-
- gDone = false;
- mouseRgn = nil;
-
- while ( gDone == false ) {
- gotEvent = WaitNextEvent(everyEvent,&event,kSleep,mouseRgn);
- if ( gotEvent ) DoEvent( &event );
- }
- }
-
-
- void DoEvent( EventRecord *event )
- {
- char theChar;
- Boolean toActive;
-
- switch( event->what ) {
- case kHighLevelEvent:
- if ( event->message == kCoreEventClass )
- switch ( *((long *) (&(event->where))) ) {
- case kAEOpenApplication: gAEOpenAppl = true; break;
- case kAEOpenDocuments: gAEOpenDocs = true; break;
- case kAEPrintDocuments: gAEPrintDoc = true; break;
- case kAEQuitApplication: gAEQuitAppl = true; break;
- default: break; }
- AEProcessAppleEvent( event );
- break;
- case mouseDown:
- HandleMouseDown( event );
- break;
- case mouseUp:
- case keyUp:
- break;
- case keyDown:
- case autoKey:
- case updateEvt:
- DoUpdate( (WindowPtr) (event->message), event );
- break;
- case activateEvt:
- toActive = ( (event->modifiers & activeFlag) == activeFlag );
- DoActivate( (WindowPtr) (event->message), toActive );
- break;
- case diskEvt:
- case networkEvt:
- case driverEvt:
- case app1Evt:
- case app2Evt:
- case app3Evt:
- case osEvt:
- DoSuspentResume( event );
- break;
- }
- }
-
- #endif /* SAMPLE */
-
-
-
-